activiti 快速入门--组任务(candidate users)分配(6) - Menco的博客 - CSDN博客

创建时间:2019/1/25 13:43
来源:https://blog.csdn.net/u011320740/article/details/53018040


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011320740/article/details/53018040

例如有这样一个需求:你的上司也就是经理有两个或多个以上,那么你需要提交申请到他们手上,主要有一个认领了该任务,然后审批通过即可,具体实现如下:

1)     在原有基础上继续修改流程图:

 

2)     部署流程,启动流程

3)     申请人发起申请任务:

  1. 1
    @Test
  2. 2
  3. 3
    publicvoid completeTask(){
  4. 4
  5. 5
    Map<String,Object> map= newHashMap<String,Object>();
  6. 6
  7. 7
    Taskform taskform = new Taskform(3, "事假", "今天老子");
  8. 8
  9. 9
    map.put("users", "a,b,c");
  10. 10
  11. 11
    map.put("day",taskform.getDay());
  12. 12
  13. 13
    String taskId = "155005";
  14. 14
  15. 15
    processEngine.getTaskService().setVariable(taskId,"taskform",taskform);
  16. 16
  17. 17
    processEngine.getTaskService().complete(taskId,map);//完成任务
  18. 18
  19. 19
    System.out.println("完成任务,任务ID"+taskId);
  20. 20
  21. 21
    }


     补充:map.put("users","a,b,c");users”对应流程图中的candidate #{users},多人用“,”分割

       运行后查看数据表act_hi_identitylink

       

      Act_ru_task表中:assignee字段是空的

   

     

4)     查询下组参与人员的任务:

  1. 1
    @Test
  2. 2
  3. 3
    publicvoid findMyPersonTask(){
  4. 4
  5. 5
    String assignee = "a";
  6. 6
  7. 7
    List<Task>taskList = processEngine.getTaskService()//获取任务service
  8. 8
  9. 9
    .createTaskQuery()//创建查询对象
  10. 10
  11. 11
    //.taskAssignee(assignee)//指定查询人
  12. 12
  13. 13
    .taskCandidateUser(assignee)//参与者,组任务查询
  14. 14
  15. 15
    .list();
  16. 16
  17. 17
    if(taskList.size()>0){
  18. 18
  19. 19
    for (Task task : taskList) {
  20. 20
  21. 21
    System.out.println("代办任务ID:"+task.getId());
  22. 22
  23. 23
    System.out.println("代办任务name:"+task.getName());
  24. 24
  25. 25
    System.out.println("代办任务创建时间:"+task.getCreateTime());
  26. 26
  27. 27
    System.out.println("代办任务办理人:"+task.getAssignee());
  28. 28
  29. 29
    System.out.println("流程实例ID:"+task.getProcessInstanceId());
  30. 30
  31. 31
    System.out.println("执行对象ID:"+task.getExecutionId());
  32. 32
  33. 33
    }
  34. 34
  35. 35
    }
  36. 36
  37. 37
    }
  38. 38


注意:查询用的是.taskCandidateUser(assignee)

5)     认领任务:

 

  1. 1
    @Test
  2. 2
  3. 3
    publicvoid claim(){
  4. 4
  5. 5
    //任务ID
  6. 6
  7. 7
    String taskId = "122502";
  8. 8
  9. 9
    //个人任务的办理人
  10. 10
  11. 11
    String userId = "a";
  12. 12
  13. 13
    processEngine.getTaskService()//
  14. 14
  15. 15
    .claim(taskId,userId);
  16. 16
  17. 17
    }


补充:claimsetAssignee区别在于claim领取之后别人不可以再领取不然会报错而setAssignee则不然

认领之后其他人员再查询时则不存在,而act_ru_task表中assignee字段为认领人‘a’,认领之后其他操作和一起都一样

6)     补充点:

1.  被认领之后的任务可再扯回组任务(前提:之前这个任务是组任务),其他人员则还可以认领:

  1. 1
    @Test
  2. 2
  3. 3
    publicvoid setAssignee(){
  4. 4
  5. 5
    //任务ID
  6. 6
  7. 7
    String taskId = "157507";
  8. 8
  9. 9
    processEngine.getTaskService()//
  10. 10
  11. 11
    .setAssignee(taskId, null);
  12. 12
  13. 13
    }


2.  组任务可以继续添加组参与人员:

  1. 1
    @Test
  2. 2
  3. 3
    publicvoid addGroupUser(){
  4. 4
  5. 5
    //任务ID
  6. 6
  7. 7
    String taskId = "157507";
  8. 8
  9. 9
    //新增组任务的成员
  10. 10
  11. 11
    String userId = "c";
  12. 12
  13. 13
    processEngine.getTaskService()//
  14. 14
  15. 15
    .addCandidateUser(taskId, userId);
  16. 16
  17. 17
    }


3.  组任务可以删除参与人员:

  1. 1
    @Test
  2. 2
  3. 3
    publicvoid deleteGroupUser(){
  4. 4
  5. 5
    //任务ID
  6. 6
  7. 7
    String taskId = "157507";
  8. 8
  9. 9
    //新增组任务的成员
  10. 10
  11. 11
    String userId = "cai";
  12. 12
  13. 13
    processEngine.getTaskService()//
  14. 14
  15. 15
    .deleteCandidateUser(taskId, userId);
  16. 16
  17. 17
    }


4.  查询正在执行的组任务列表:

  1. 1
    @Test
  2. 2
  3. 3
    publicvoid findGroupCandidate(){
  4. 4
  5. 5
    //任务ID
  6. 6
  7. 7
    String taskId = "157507";
  8. 8
  9. 9
    List<IdentityLink>list = processEngine.getTaskService()//
  10. 10
  11. 11
    .getIdentityLinksForTask(taskId);
  12. 12
  13. 13
    if(list!=null && list.size()>0){
  14. 14
  15. 15
    for(IdentityLinkidentityLink:list){
  16. 16
  17. 17
    System.out.println("任务ID:"+identityLink.getTaskId());
  18. 18
  19. 19
    System.out.println("用户ID:"+identityLink.getUserId());
  20. 20
  21. 21
    System.out.println("-----------------------------------");
  22. 22
  23. 23
    }
  24. 24
  25. 25
    }
  26. 26
  27. 27
    }


       运行结果:

         

5.  组任务像前面讲的个人任务一样可以用监听器或写死方式,监听器notify()方法里用delegateTask.addCandidateUser()来设值